package cn.zebra.dev.admin.module.role.service;

import cn.zebra.dev.admin.module.role.entity.AdminRoleMenuEntity;
import cn.zebra.dev.base.module.role.service.BaseRoleMenuService;
import cn.zebra.dev.ibatis.plus.service.IService;
import cn.zebra.dev.ibatis.plus.utils.PageUtils;
import org.springframework.transaction.annotation.Transactional;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Future;

/**
 * 后台角色与菜单对应关系
 *
 * @author runnable
 * @date 2019-09-07 17:02:18
 */
public interface AdminRoleMenuService extends BaseRoleMenuService<AdminRoleMenuEntity>, IService<AdminRoleMenuEntity> {
    /**
     * 根据菜单id查询所有符合关联的集合
     *
     * @param menuId 菜单id
     * @return 关联的集合
     */
    @Override
    default List<AdminRoleMenuEntity> findListByMenuId(Long menuId) {
        return this.findListByFieldValue(AdminRoleMenuEntity::getMenuId, menuId);
    }

    PageUtils queryPage(Map<String, Object> params);

    /**
     * 根据角色id查询该角色绑定的菜单id
     *
     * @param roleId 角色id
     * @return 菜单id集合
     */
    List<Long> queryMenuIdList(Long roleId);

    /**
     * 保存或修改角色菜单绑定信息
     *
     * @param roleId     角色id
     * @param menuIdList 菜单id集合
     * @return 成功返回true 失败返回false
     */
    @Transactional(rollbackFor = Exception.class)
    boolean saveOrUpdate(Long roleId, List<Long> menuIdList);

    /**
     * 批量线程保存
     *
     * @param entityList 后台角色与菜单对应关系集合
     * @return 成功返回true 保存失败返回false
     */
    @Override
    boolean saveBatch(Collection<AdminRoleMenuEntity> entityList);

    /**
     * 异步保存
     *
     * @param entity 后台角色与菜单对应关系
     * @return 异步回调对象
     */
    Future<Boolean> asyncSave(AdminRoleMenuEntity entity);
}

